package Ocsinventory::Agent::Backend::OS::HPUX::Memory;
use strict;

sub check { $^O =~ /hpux/ }

sub run { 
  my $params = shift;
  my $common = $params->{common};

  my $capacity=0;
  my $caption;
  my $description;
  my $numslot;
  my $subnumslot;
  my $serialnumber;
  my $type;
  my @list_mem=`echo 'sc product mem;il'| /usr/sbin/cstm`;

  my $ok=0;

  if ( `uname -m` =~ /ia64/ )
  {
      for ( `echo 'sc product IPF_MEMORY;il' | /usr/sbin/cstm` )
      {
         if ( /\w+IMM\s+Location/ )
         {
	   ;
         }
         elsif ( /(\w+IMM)\s+(\w+)\s+(\S+)\s+(\w+IMM)\s+(\w+)\s+(\S+)/ )
         {
             $common->addMemories({
                   capacity => $3,
                   caption => $2 ,
                   numslots => "1" ,
                   type => $1,
			    });
             $common->addMemories({
                   capacity => $6,
                   caption => $5 ,
                   numslots => "1" ,
                   type => $4,
			    });
          } 
      }
  }
  else
  {
     for ( `echo 'sc product system;il' | /usr/sbin/cstm ` ) {
       if ( /FRU\sSource\s+=\s+\S+\s+\(memory/ ) {
          $ok=0;
          #print "FRU Source memory\n";
       }
       if ( /Source\s+Detail\s+=\s4/ ) {
         $ok=1;
         #print "Source Detail IMM\n";
       }
       if ( /Extender\s+Location\s+=\s+(\S+)/ ) {
         $subnumslot=$1;
         #print "Extended sub $subnumslot\n";
       };
       if ( /DIMMS\s+Rank\s+=\s+(\S+)/ ) {
         $numslot=sprintf("%02x",$1);
         #print "Num slot $numslot\n";
       }
    
       if ( /FRU\s+Name\.*:\s+(\S+)/ ) {
          if ( /(\S+)_(\S+)/ ) {
             $type=$1;
             $capacity=$2;
             #print "Type $type capa $capacity\n";
          }
          elsif ( /(\wIMM)(\S+)/ )
          {
             $ok=1;
             $type=$1;
             $numslot=$2;
             #print "Type $type numslot $numslot\n";
          }
       }
       if ( /Part\s+Number\.*:\s*(\S+)\s+/ ) {
         $description=$1;
         #print "ref $description\n";
       };
       if ( /Serial\s+Number\.*:\s*(\S+)\s+/ ) {
          $serialnumber=$1;
          if ( $ok eq 1 ) 
          {
             if ( $capacity eq 0 )
             {
                foreach ( @list_mem )
                {
                   if ( /\s+$numslot\s+(\d+)/ )
                   {
                      $capacity=$1;
                      #print "Capacity $capacity\n";
                   }
                }
             }
             $common->addMemories({
                   CAPACITY => $capacity,
	           CAPTION => "Ext $subnumslot Slot $numslot" ,
                   DESCRIPTION => "Part Number $description",
                   NUMSLOTS => "1" ,
		   SERIALNUMBER => $serialnumber,
                   TYPE => $type,
			    });
              $ok=0;
              $capacity=0;
	   };
          #print "Serial $serialnumber\n\n";
       };
     };
   }

}

1;
